item12-复制对象时要复制所有成员

当自己实现了拷贝构造函数、赋值运算符后,编译器不再检查拷贝行为是否完整,容易发生拷贝时遗漏成员变量。

当派生类继承基类后,实现的拷贝构造函数、赋值运算符可能只拷贝了派生类的成员,遗漏对基类成员变量的拷贝。

当为派生类写实现拷贝行为时,必须拷贝其基类的成员变量,但基类的成员变量往往是私有的,无法直接访问,所以

  • 应该让派生类的拷贝构造函数调用相应基类的拷贝构造函数
  • 应该让派生类的赋值运算符调用相应基类的赋值运算符
class B : private A {
public:
    B(const B& rhs) : A(rhs){
        ...
    }
    B& operator=(const B& rhs){
        ...
        A::operator(rhs);
        ...
    }
}

总结

当编写 copying 函数时(拷贝构造函数、赋值运算符):

  • 复制所有local成员变量
  • 调用所有基类内适当的copying函数

不要尝试以某个copying函数实现另一个copying函数,当二者实现相似时,可以声明一个private的成员函数受copying函数调用